Dynamic random access memory (DRAM) devices are used across a wide range of electronic devices. In many such electronic devices, for efficiency reasons, DRAM devices are shared by many different components that can generate read and/or write traffic to the DRAM devices. Although DRAM devices offer substantial bandwidth and throughput, competing demands and/or device access patterns (for example, reading/writing and/or accesses to different pages or banks) can significantly increase latency and/or significantly reduce throughput experienced by a particular requester of memory. Even within an individual component, such as a dedicated graphics processing unit (GPU), there may be multiple subcomponents with competing and/or concurrent demands for memory bandwidth. In some cases, even where a dedicated DRAM device is allocated to a single component or subcomponent memory access patterns, short term increases in throughput demands, and/or short term slowdowns in processing can create short term performance degradation. Additionally, DRAM devices periodically perform refresh operations, during which their content is not accessible. Such issues may be more significant for mobile electronic devices which, for reasons such as improving battery life, reducing device production cost, and/or reducing device complexity, operate with lower total DRAM throughput in general than in non-mobile devices.
Such uncertainty and variability in memory latency and/or throughput can lead to not meeting real-time deadlines for providing data to components relying on rapid retrieval of data from a DRAM device. Although buffering has been used to reduce sensitivity to short-term decreases in memory bandwidth and throughput, a buffer may still experience “underflow” as a result of a significant decrease in throughput, leaving a requesting real-time data sink without needed data. This is particularly true for low latency real-time applications. Previous approaches, involving recovering from underflow and generating substitute data while recovering from underflow, generally result in large-scale corruption in output due to extended recovery time (for graphics output, such approaches result in large and obvious areas of a frame being corrupted and/or repeated or dropped frames), and wasted memory bandwidth to fetch data for already-underflowed outputs.